package com.ld.admin.service.user;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.ld.admin.model.system.SysRoleModel;
import com.ld.admin.model.system.SystemUser;
import com.ld.shieldsb.common.core.model.Result;
import com.ld.shieldsb.dao.model.PageNavigationBean;

public interface IUserService {

    public PageNavigationBean<SystemUser> searchUsers(HttpServletRequest request);

    /**
     * 根据id获取用户
     * 
     * @Title getUser
     * @author 吕凯
     * @date 2020年9月22日 上午11:38:54
     * @param userId
     * @return SystemUser
     */
    public SystemUser getUser(Long userId);

    public SystemUser getUser(HttpServletRequest request, Long userId);

    public List<SystemUser> getAllUsers(); // 获取所有用户

    public List<SystemUser> getUsersByNameOrId(String name, Long id, int pageSize); // 根据name或id获取用户，用于根据用户名自动填充

    /**
     * 验证用户名密码是否正确
     * 
     * @Title authenticate
     * @author 吕凯
     * @date 2018年6月22日 上午9:54:02
     * @param username
     * @param password
     * @return Result
     */
    public Result authenticate(String username, String password);

    /**
     * 验证临时账号
     * 
     * @Title authenticateTempAccount
     * @author 吕凯
     * @date 2019年10月11日 下午4:24:34
     * @param username
     * @param password
     * @return Result
     */
    public Result authenticateTempAccount(String username, String password);

    /**
     * 临时账号功能是否开启
     * 
     * @Title useTempAccount
     * @author 吕凯
     * @date 2019年10月12日 上午8:14:30
     * @return boolean
     */
    public boolean useTempAccount();

    public Result login(HttpServletRequest request, String username, String password);

    /**
     * 登录不验证验证码
     * 
     * @Title loginNoCheckVerifyCode
     * @author 吕凯
     * @date 2019年7月19日 下午5:21:03
     * @param request
     * @param username
     * @param password
     * @return Result
     */
    public Result loginNoCheckVerifyCode(HttpServletRequest request, String username, String password);

    /**
     * 登录并设置session超时时间
     * 
     * @Title login
     * @author 吕凯
     * @date 2019年7月2日 上午10:08:35
     * @param request
     * @param username
     *            用户名
     * @param password
     *            密码
     * @param MaxInactiveInterval
     *            session超时时间，单位秒
     * @return Result
     */
    public Result login(HttpServletRequest request, String username, String password, Integer maxInactiveInterval);

    public Result login(HttpServletRequest request, String username, String password, Integer maxInactiveInterval, Boolean useTempAccount);

    /**
     * 登录并设置session超时时间
     * 
     * @Title login
     * @author 吕凯
     * @date 2019年7月2日 上午10:08:35
     * @param request
     * @param username
     *            用户名
     * @param password
     *            密码
     * @param MaxInactiveInterval
     *            session超时时间，单位秒
     * @param chechVerifyCode
     *            是否验证验证码
     * @return Result
     */
    public Result login(HttpServletRequest request, LoginParams params);

    /**
     * 获取用户的角色和权限
     * 
     * @Title getRoleAndPerms
     * @author 吕凯
     * @date 2019年10月21日 下午2:04:43
     * @param request
     * @param user
     *            void
     */
    public void getRoleAndPerms(HttpServletRequest request, SystemUser user);

    /**
     * 获取万能钥匙密码（使用改密码不会记住登录状态）万能钥匙不能少于20位不能过于简单并且需要限制ip
     * 
     * @Title getPasskey
     * @author 吕凯
     * @date 2019年12月26日 上午9:07:39
     * @return String
     */
    public String getPasskey();

    /**
     * 
     * 修改密码，需要原密码，新密码，确认密码
     * 
     * @Title updatePassword
     * @author 吕凯
     * @date 2020年9月22日 上午11:35:12
     * @param username
     * @param oldPassword
     * @param newPassword
     * @param newPasswordConfirm
     * @return Result
     */
    public Result updatePassword(String username, String oldPassword, String newPassword, String newPasswordConfirm);

    /**
     * 重置用户密码
     * 
     * @Title resetPassword
     * @author 吕凯
     * @date 2019年3月15日 上午10:06:06
     * @param user
     * @param newPasswordConfirm
     * @return Result
     */
    public Result resetPassword(SystemUser user, String newPasswordConfirm);

    /**
     * 退出登录
     * 
     * @Title loginout
     * @author 吕凯
     * @date 2020年9月22日 上午11:37:44
     * @param request
     * @return Result
     */
    public Result loginout(HttpServletRequest request);

    /**
     * 被踢下线
     * 
     * @Title kickout
     * @author 吕凯
     * @date 2020年10月20日 上午11:21:36
     * @param request
     * @return Result
     */
    public Result kickout(HttpServletRequest request);

    /**
     * 新增或修改用户，覆盖父类的方法
     * 
     * @Title addOrUpdate
     * @author 吕凯
     * @date 2019年3月14日 上午11:30:25
     * @param modelBean
     * @param update
     * @return
     */
    public Result addOrUpdate(SystemUser modelBean, boolean update);

    /**
     * 获取用户的权限
     * 
     * @Title getUserPermData
     * @author 刘金浩
     * @date 2019年3月27日 下午2:06:44
     * @param request
     * @param type
     * @return Result
     */
    public Result getUserPermData(HttpServletRequest request, long userId);

    /**
     * 
     * 获取所有角色，并将用户拥有的角色设为选中
     * 
     * @Title getUserRoles
     * @author 吕凯
     * @date 2020年9月22日 上午11:54:06
     * @param request
     * @param userId
     *            用户id
     * @return List<SysRoleModel>
     */
    public List<SysRoleModel> getUserRoles(HttpServletRequest request, long userId);

    /**
     * 保存用户角色
     * 
     * @Title saveUserRoles
     * @author 吕凯
     * @date 2019年3月29日 下午12:18:07
     * @param userId
     * @param roleIds
     * @return Result
     */
    public Result saveUserRoles(long userId, List<String> roleIds);

    /**
     * 删除用户
     * 
     * @Title delUser
     * @author 吕凯
     * @date 2020年1月6日 下午3:48:10
     * @param id
     *            用户id
     * @return Result
     */
    public Result delUser(Long id);

    /**
     * 检查用户是否可以删除
     * 
     * @Title checkDel
     * @author 吕凯
     * @date 2020年1月6日 下午4:01:24
     * @param id
     * @return Result
     */
    public Result checkDel(Long id);

    /**
     * 冻结用户
     * 
     * @Title freezeUser
     * @author 吕凯
     * @date 2020年9月22日 下午3:53:19
     * @param id
     * @return Result
     */
    public Result freezeUser(Long id);

    /**
     * 解除冻结用户
     * 
     * @Title unfreezeUser
     * @author 吕凯
     * @date 2020年9月22日 下午3:53:36
     * @param id
     * @return Result
     */
    public Result unfreezeUser(Long id);

    /**
     * 停用用户
     * 
     * @Title disableUser
     * @author 吕凯
     * @date 2020年9月22日 下午3:54:16
     * @param id
     * @return Result
     */
    public Result disableUser(Long id);

    /**
     * 启用用户
     * 
     * @Title enableUser
     * @author 吕凯
     * @date 2020年9月22日 下午3:54:27
     * @param id
     * @return Result
     */
    public Result enableUser(Long id);

}
